From: Marco Trevisan (TreviƱo) Date: Mon, 12 Aug 2019 14:25:48 +0000 (+0200) Subject: workspacesDisplay: Disconnect MetaLater and parent signals on destroy X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~811^2^2~161 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=8656102182da8f8d52c0cea7495aff1b43c3bf21;p=gnome-shell.git workspacesDisplay: Disconnect MetaLater and parent signals on destroy When the WorkspacesDisplay actor is destroyed we should remove the ongoing later and parent widget connections to avoid accessing an invalid object on callback. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/700 --- diff --git a/js/ui/workspacesView.js b/js/ui/workspacesView.js index af490e94a..8c1ba81a6 100644 --- a/js/ui/workspacesView.js +++ b/js/ui/workspacesView.js @@ -524,6 +524,22 @@ var WorkspacesDisplay = class { this._keyPressEventId = 0; this._fullGeometry = null; + + this.actor.connect('destroy', this._onDestroy.bind(this)); + } + + _onDestroy() { + if (this._notifyOpacityId) { + let parent = this.actor.get_parent(); + if (parent) + parent.disconnect(this._notifyOpacityId); + this._notifyOpacityId = 0; + } + + if (this._parentSetLater) { + Meta.later_remove(this._parentSetLater); + this._parentSetLater = 0; + } } _onPan(action) { @@ -717,7 +733,11 @@ var WorkspacesDisplay = class { oldParent.disconnect(this._notifyOpacityId); this._notifyOpacityId = 0; - Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { + if (this._parentSetLater) + return; + + this._parentSetLater = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { + this._parentSetLater = 0; let newParent = this.actor.get_parent(); if (!newParent) return;